import {
	asyncRoutes,
	constantRoutes
} from '@/router'

/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(auths, route) {
	if (route.meta && route.meta.auth) {
		return auths.some(currentAuth => route.meta.auth == currentAuth)
	} else {
		return true
	}
}


/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, auths) {
	const res = []

	routes.forEach(route => {
		const tmp = { ...route
		}
		if (hasPermission(auths, tmp)) {
			if (tmp.children) {
				tmp.children = filterAsyncRoutes(tmp.children, auths)
			}
			res.push(tmp)
		}
	})

	return res
}

const state = {
	routes: [],
	addRoutes: []
}

const mutations = {
	SET_ROUTES: (state, routes) => {
		state.addRoutes = routes
		state.routes = constantRoutes.concat(routes)
	}
}

const actions = {
	generateRoutes({
		commit
	}, auths) {
		return new Promise(resolve => {
			let accessedRoutes
			if (auths.includes('admin')) {
				accessedRoutes = asyncRoutes || []
			} else {
				accessedRoutes = filterAsyncRoutes(asyncRoutes, auths)
			}
			commit('SET_ROUTES', accessedRoutes)
			resolve(accessedRoutes)
		})
	}
}

export default {
	namespaced: true,
	state,
	mutations,
	actions
}
